home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '90 / Source Code ƒ.sea / Source Code ƒ / Modula2 ƒ / DataStack Filer / DemoTest.MOD.o < prev    next >
Encoding:
Text File  |  1990-06-15  |  5.8 KB  |  222 lines  |  [OBJ /MPS ]

  1. dCount := dataStkR.idCount;
  2.  
  3.         IF NOT LoadKeyArrays(idKeys,nameKeys,totalFilled,fRefNum) THEN
  4.             DisposeDataStack(dataStk);
  5.             RETURN NIL;
  6.             END;
  7.  
  8.     (* load body *)
  9.         count := VAL(LONGINT,cardSize * filledCards);
  10.         dataStackErr := FSRead(fRefNum,count,dataPtr);
  11.         END;(*with*)
  12.     IF dataStackErr # 0 THEN 
  13.         DisposeDataStack(dataStk);
  14.         RETURN NIL;
  15.         END;(*with*)
  16.     
  17.     RETURN dataStk;
  18.     END LoadDataStack;
  19.  
  20.  
  21. PROCEDURE WriteGrowStacks(gStk :GrowStack; cardSize:CARDINAL; fRefNum:INTEGER);
  22. VAR count :LONGINT;
  23. BEGIN
  24.     IF gStk = NIL THEN RETURN; END;
  25.     
  26.     WITH gStk^^ DO
  27.         count := VAL(LONGINT,filledCards * cardSize);
  28.         dataStackErr := FSWrite(fRefNum,count,dataPtr);
  29.         IF dataStackErr # 0 THEN RETURN; END;
  30.         END;
  31.     
  32.     WriteGrowStacks(gStk^^.growStk,cardSize,fRefNum);
  33.     END WriteGrowStacks;
  34.  
  35. PROCEDURE DumpDataStack(stack:DataStack; fRefNum:INTEGER):BOOLEAN;
  36. VAR
  37.     err :OSErr;
  38.     dataStkR :DataStackRec;
  39.     count,count2 :LONGINT;
  40. BEGIN
  41.     dataStackErr := noErr;
  42.     (* verify disk space *)
  43.     WITH stack^^ DO
  44.         IF totalFilled < filledCards THEN RETURN FALSE; END;
  45.  
  46.         count := SIZE(DataStackRec) + ( VAL(LONGINT,cardSize) * VAL(LONGINT,totalFilled) );
  47.         INC(count,VAL(LONGINT,totalFilled)*4); (* space for both keys arrays *)
  48.         count2 := count;
  49.         END;
  50.     err := AllocContig(fRefNum,count);
  51.     IF err # 0 THEN
  52.         dataStackErr := Allocate(fRefNum,count2);
  53.         IF dataStackErr # 0 THEN RETURN FALSE; END;
  54.         END;
  55.     dataStkR := stack^^; (* save copy of dataStackRecord. *)
  56.     WITH dataStkR DO
  57.         DEC(cardSize,headerSize); (* rebuild DataStack when restored with orig. size. *)
  58.         filledCards := totalFilled; (* when restored, filled = total. *)
  59.         IF initialCards < totalFilled THEN
  60.             initialCards := totalFilled;
  61.             END;
  62.         END;(*with*)
  63.  
  64.     (* write header *)
  65.     count := SIZE(DataStackRec);
  66.     dataStackErr := FSWrite(fRefNum,count,ADR(dataStkR));
  67.     IF dataStackErr # 0 THEN RETURN FALSE; END;
  68.     
  69.     (* write keys arrays *)
  70.     WITH stack^^ DO
  71.         count := VAL(LONGINT,totalFilled)*SIZE(CARDINAL) + SIZE(CARDINAL);
  72.         count2 := count;
  73.         dataStackErr := FSWrite(fRefNum,count,idKeys^);
  74.         IF dataStackErr # 0 THEN RETURN FALSE; END;
  75.         
  76.         dataStackErr := FSWrite(fRefNum,count2,nameKeys^);
  77.         IF dataStackErr # 0 THEN RETURN FALSE; END;
  78.         END; (*with*)
  79.     
  80.     (* write stack *)
  81.     WITH stack^^ DO
  82.         count := VAL(LONGINT,filledCards * cardSize);
  83.         dataStackErr := FSWrite(fRefNum,count,dataPtr);
  84.         IF dataStackErr # 0 THEN RETURN FALSE; END;
  85.         END;
  86.     
  87.     (* write grow stacks *)
  88.     WriteGrowStacks(stack^^.growStk,stack^^.cardSize,fRefNum);
  89.     IF dataStackErr # noErr THEN RETURN FALSE; END;
  90.  
  91.     RETURN TRUE;
  92.     END DumpDataStack;
  93.  
  94.  
  95. PROCEDURE DisposeDataStack(stack:DataStack);
  96. VAR gs,tgs :GrowStack;
  97. BEGIN
  98.     DisposPtr(stack^^.dataPtr);
  99.     DisposHandle(stack^^.idKeys);
  100.     DisposHandle(stack^^.nameKeys);
  101.     
  102.     gs := stack^^.growStk;
  103.     WHILE gs # NIL DO
  104.         tgs := gs;
  105.         DisposPtr(gs^^.dataPtr);
  106.         gs := gs^^.growStk;
  107.         DisposHandle(tgs);
  108.         END;
  109.     DisposHandle(stack);
  110.     END DisposeDataStack;
  111.  
  112.  
  113. (* *****************************   card routines   ******************************** *)
  114.  
  115. PROCEDURE FindGrowHeaderAddr(gStk:GrowStack; cardNum0,cSize:CARDINAL):HeadPtr;
  116. BEGIN
  117.     WITH gStk^^ DO
  118.         IF cardNum0 >= filledCards THEN
  119.             RETURN FindGrowHeaderAddr(growStk,cardNum0-filledCards,cSize);
  120.         ELSE
  121.             RETURN VAL(ADDRESS, VAL(LONGCARD,cSize) * VAL(LONGCARD,cardNum0)) + 
  122.                         VAL(ADDRESS, dataPtr);
  123.             END;
  124.         END;
  125.     END FindGrowHeaderAddr;
  126.  
  127. PROCEDURE GetHeaderAddr(stack:DataStack; cardNum:CARDINAL):HeadPtr;
  128. BEGIN
  129.     IF stack = NIL THEN RETURN NIL END;
  130.     IF (cardNum < 1) OR (cardNum > stack^^.totalFilled) THEN RETURN NIL; END;
  131.     DEC(cardNum); (* gives 0 based indexing to cardHeader *)
  132.     WITH stack^^ DO
  133.         IF cardNum >= filledCards THEN
  134.             RETURN FindGrowHeaderAddr(growStk,cardNum-filledCards,cardSize);
  135.         ELSE
  136.             RETURN VAL( ADDRESS,VAL(LONGCARD,cardNum) * VAL(LONGCARD,cardSize) ) 
  137.                              + VAL(ADDRESS, dataPtr);
  138.             END;
  139.         END;
  140.     END GetHeaderAddr;
  141.  
  142.  
  143.     (* **************************   search routines   ***************************** *)
  144.  
  145.     VAR
  146.         theKeyIndex :CARDINAL;    (* index of last compare before return/failure *)
  147.         
  148.         theSearchID :LONGCARD;
  149.         theSearchName :StringPtr;
  150.         theStack :DataStack; (* stack to be searched *)
  151.     
  152.     PROCEDURE SearchStackByName(min,max :CARDINAL):CARDINAL;
  153.     VAR
  154.         strPtr :StringPtr;
  155.         n :INTEGER;
  156.     BEGIN
  157.         IF max < min THEN RETURN 0; END;
  158.         theKeyIndex := (min+max) DIV 2;
  159.         
  160.         strPtr := VAL(StringPtr,GetHeaderAddr(theStack,theStack^^.nameKeys^^[theKeyIndex]));
  161.         n := IUCompString(theSearchName,strPtr);
  162.         
  163.         IF n = 0 THEN                                    (* theSearchX matches (indx)^. *)
  164.             RETURN theKeyIndex; 
  165.         ELSIF n < 0 THEN                                (* theSearchX preceeds (indx)^. *)
  166.             RETURN SearchStackByName(min,theKeyIndex-1);
  167.         ELSE                                                (* theSearchX follows (indx)^. *)
  168.             RETURN SearchStackByName(theKeyIndex+1,max);
  169.             END;
  170.         END SearchStackByName;
  171.     
  172.     PROCEDURE SearchStackByID(min,max :CARDINAL):CARDINAL;
  173.     VAR 
  174.         header :HeadPtr;
  175.         strPtr :StringPtr;
  176.         n :INTEGER;
  177.     BEGIN
  178.         IF max < min THEN RETURN 0; END;
  179.         theKeyIndex := (min+max) DIV 2;
  180.         
  181.         header := GetHeaderAddr(theStack,theStack^^.idKeys^^[theKeyIndex]);
  182.         
  183.         IF theSearchID = header^.id THEN
  184.             RETURN theKeyIndex;
  185.         ELSIF theSearchID < header^.id THEN
  186.             RETURN SearchStackByID(min,theKeyIndex-1);
  187.         ELSE
  188.             RETURN SearchStackByID(theKeyIndex+1,max);
  189.             END;
  190.         END SearchStackByID;
  191.     
  192.  
  193.  
  194. PROCEDURE NewGrowStack(stack:DataStack):GrowStack;
  195. VAR
  196.     gStk :GrowStack;
  197.     dPtr :Ptr;
  198.     gCards :CARDINAL;
  199.     iKeys,nKeys :DataKeysHnd;
  200.     keyArrSize,gCardKeyGrow :LONGINT;
  201. BEGIN
  202.     WITH stack^^ DO
  203.         iKeys := idKeys;
  204.         nKeys := nameKeys;
  205.         gCardKeyGrow := VAL(LONGINT,growCards)*SIZE(CARDINAL);
  206.         
  207.         dPtr := NewPtr(VAL(LONGINT,cardSize) * VAL(LONGINT,growCards));
  208.         IF dPtr = NIL THEN 
  209.             dataStackErr := MemError();
  210.             RETURN NIL;
  211.             END;
  212.         END;
  213.  
  214.     keyArrSize := GetHandleSize(iKeys);
  215.     SetHandleSize(iKeys,keyArrSize + gCardKeyGrow);
  216.     IF MemError() # 0 THEN
  217.         dataStackErr := MemError();
  218.         DisposPtr(dPtr);
  219.         RETURN NIL;
  220.         END;
  221.     SetHandleSize(nKeys,keyArrSize + gCardKeyGrow);
  222.     IF MemEr